<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>模糊性 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/fuzziness.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/fuzziness.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/fuzziness.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/fuzziness.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="languages.html">处理人类语言</a></span>
»
<span class="breadcrumb-link"><a href="fuzzy-matching.html">拼写错误</a></span>
»
<span class="breadcrumb-node">模糊性</span>
</div>
<div class="navheader">
<span class="prev">
<a href="fuzzy-matching.html">« 拼写错误</a>
</span>
<span class="next">
<a href="fuzzy-query.html">模糊查询 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="fuzziness"></a>模糊性 (Fuzziness)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/270_Fuzzy_matching/20_Fuzziness.asciidoc">edit</a>
</h2>
</div></div></div>
<p><em>模糊匹配</em> 认为 “模糊” 相似的两个词是同一个词。首先，我们需要对我们所说的  <em>模糊性</em> 进行定义。</p>
<p>在1965年，Vladimir Levenshtein 开发出了 <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" class="ulink" target="_top">莱温斯坦距离(Levenshtein distance)</a>， 通常叫"编辑距离"，
用来度量从一个单词转换到另一个单词需要多少次单个字符编辑。他提出了三种类型的单字符编辑操作：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
一个字符 <em>替换</em> 另一个字符： _f_ox → _b_ox
</li>
<li class="listitem">
<em>插入</em> 一个新的字符：sic → sic_k_
</li>
<li class="listitem">
<em>删除</em> 一个字符：b_l_ack → back
</li>
</ul>
</div>
<p><a href="http://en.wikipedia.org/wiki/Frederick_J._Damerau" class="ulink" target="_top">Frederick Damerau</a>
后来在这些操作基础上做了一个扩展：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
相邻两个字符的 <em>换位</em> ： _st_ar → _ts_ar
</li>
</ul>
</div>
<p>举个例子，将单词 <code class="word">bieber</code> 转换成 <code class="word">beaver</code> 需要下面几个步骤：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
把 <code class="word">b</code> 替换成 <code class="word">v</code> ：bie_b_er → bie_v_er
</li>
<li class="listitem">
把 <code class="word">i</code> 替换成 <code class="word">a</code> ：b_i_ever → b_a_ ever
</li>
<li class="listitem">
把 <code class="word">e</code> 和 <code class="word">a</code> 进行换位：b_ae_ver → b_ea_ver
</li>
</ol>
</div>
<p>这三个步骤表示 <a href="https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance" class="ulink" target="_top">Damerau-Levenshtein edit distance</a> 编辑距离为 3 。</p>

<p>显然，从 <code class="word">beaver</code> 转换成 <code class="word">bieber</code> 是一个很长的过程—他们相距甚远而不能视为一个简单的拼写错误。
Damerau 发现 80% 的拼写错误编辑距离为 1 。换句话说， 80% 的拼写错误可以对原始字符串用 <em>单次编辑</em> 进行修正。</p>

<p>Elasticsearch 指定了 <code class="literal">fuzziness</code> 参数支持对最大编辑距离的配置，默认为 ２ 。</p>

<p>当然，单次编辑对字符串的影响取决于字符串的长度。对单词 <code class="word">hat</code> 两次编辑能够产生  <code class="word">mad</code> ，
所以对一个只有 3 个字符长度的字符串允许两次编辑显然太多了。
 <code class="literal">fuzziness</code> 参数可以被设置为 <code class="literal">AUTO</code> ，这将导致以下的最大编辑距离：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
字符串只有 1 到 2 个字符时是 <code class="literal">0</code>
</li>
<li class="listitem">
字符串有 3 、 4 或者 5 个字符时是 <code class="literal">1</code>
</li>
<li class="listitem">
字符串大于 5 个字符时是 <code class="literal">2</code>
</li>
</ul>
</div>
<p>当然，你可能会发现编辑距离 <code class="literal">2</code> 仍然是太多了，返回的结果似乎并不相关。
把最大 <code class="literal">fuzziness</code> 设置为 <code class="literal">1</code> ，你可以得到更好的结果和更好的性能。</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="fuzzy-matching.html">« 拼写错误</a>
</span>
<span class="next">
<a href="fuzzy-query.html">模糊查询 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>